/*
 * @Author: Sam
 * @Date: 2020-10-12 15:23:33
 * @LastEditTime: 2021-10-13 18:43:46
 * @LastEditors: Sam
 * @Description:
 * @FilePath: \resourcesf:\thework\tofba-client\src\utils\request.js
 * @可以输入预定的版权声明、个性签名、空行等
 */

import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import Qs from 'qs'
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  withCredentials: true // 当跨域请求时发送cookie
  // timeout: 10000 // request timeout
})
service.defaults.retry = 1 // 重试次数

service.defaults.retryDelay = 1000// 重试延时

service.defaults.shouldRetry = (error) => {
  if (error.toString().indexOf('404') > -1) {
    return true
  }
}// 重试条件，默认只要是错误都需要重试

service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
let path = ''
// request interceptor
service.interceptors.request.use(
  config => {
    path = config.url
    // 在请求发送之前做些什么
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['Authorization'] = getToken()
    }
    const flag = config.url.split('/')
    // console.log('flag :>> ', flag)
    if ((['seaair', 'message', 'abroad'].includes(flag[1]) || ['seaair', 'message', 'abroad'].includes(flag[0])) && flag[3] !== 'queryChannelPrices') {
      config.headers['x-tofba-session-status'] = 'y'
    }
    // return config
    config.headers = Object.assign(config.method === 'get' ? {
      'Accept': 'application/json',
      'Content-Type': 'application/json; charset=UTF-8'
    } : {
      'Content-Type': 'application/json; charset=UTF-8'
    }, config.headers)

    if (config.method === 'post') {
      const contentType = config.headers['Content-Type']
      // 根据Content-Type转换data格式
      if (contentType) {
        if (contentType.includes('multipart')) { // 类型 'multipart/form-data;'
          console.log(12121)
        } else if (contentType.includes('json')) { // 类型 'application/json;'
          // 服务器收到的raw body(原始数据) "{name:"nowThen",age:"18"}"（普通字符串）
          config.data = JSON.stringify(config.data)
        } else { // 类型 'application/x-www-form-urlencoded;'
          // 服务器收到的raw body(原始数据) name=nowThen&age=18
          config.data = Qs.stringify(config.data)
        }
      }
    }
    return Promise.resolve(config)
  },
  error => {
    store.dispatch('app/toggleDialog', false)
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
// .interceptors.response.use(
//   /**
//    * 如果您想要获取http信息，如头信息或状态信息
//    * Please return  response => response
//    */

//   /**
//    * 通过自定义代码确定请求状态
//    */
//   response => {
//     const res = response.data

//     return res
//   },
//   error => {
//     store.dispatch('app/toggleDialog', false)
//     console.log('err' + error) // for debug
//     console.log('系统找不到路径 404 :>> ', path)
//     Message({
//       message: '系统找不到路径 ',
//       type: 'error',
//       duration: 5 * 1000
//     })

//     return Promise.reject(error)
//   }
// )
service.interceptors.response.use(response => {
  const res = response.data

  return res
}, (err) => {
  var config = err.config

  // 判断是否配置了重试

  if (!config || !config.retry) return Promise.reject(err)

  if (!config.shouldRetry || typeof config.shouldRetry !== 'function') {
    return Promise.reject(err)
  }

  // 判断是否满足重试条件

  if (!config.shouldRetry(err)) {
    return Promise.reject(err)
  }

  // 设置重置次数，默认为0

  config.__retryCount = config.__retryCount || 0

  // 判断是否超过了重试次数

  if (config.__retryCount >= config.retry) {
    return Promise.reject(err)
  }

  // 重试次数自增

  config.__retryCount += 1

  // 延时处理

  var backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve()
    }, config.retryDelay || 1)
  })

  // 重新发起axios请求

  return backoff.then(function () {
    return service(config)
  })
})

export default service
